/* 
Многоточечный термометр с LCD дисплеем
используются температурные датчики DS1820/18S20
с шиной 1-Wire от Dallas Semiconductor

CodeVisionAVR C Compiler
(C) 2000-2002 HP InfoTech S.R.L.
www.hpinfotech.ro

Чип: AT90S8515
Модель Памяти: SMALL
Размер Стека Данных: 128 байт

ТАКТОВАЯ ЧАСТОТА AT90S8515 ДОЛЖНА БЫТЬ 3.6864 МГц
Датчики DS1820/18S20 подключены к
биту 6 ПОРТА A AT90S8515 следующим образом:

[DS1820/18S20] [РАЗЪЕМ PORTA STK500]
1   GND    -       9   GND
2   DQ     -       7   PA6
3   VDD    -      10   +5V

Все температурные датчики должны быть подключены
параллельно

МЕЖДУ DQ (PA6) И +5V ДОЛЖЕН БЫТЬ ПОДКЛЮЧЕН
ПОДТЯГИВАЮЩИЙ РЕЗИСТОР 4.7k!
*/

#asm
.equ __w1_port=0x1b
.equ __w1_bit=6
#endasm

/* 
Используйте алфавитно-цифровой LCD 2x16, подключенный
к PORTC следующим образом:
[LCD]  [STK500 PORTC HEADER]
1 GND - 9  GND
2 +5V - 10 VCC
3 VLC - напряжение управления контрастом LCD 0..1V
4 RS  - 1  PC0
5 RD  - 2  PC1
6 EN  - 3  PC2
11 D4 - 5  PC4
12 D5 - 6  PC5
13 D6 - 7  PC6
14 D7 - 8  PC7
*/

#asm
  .equ __lcd_port=0x15
#endasm

#include <lcd.h> // программы управления LCD
#include <ds1820.h>
#include <delay.h>
#include <math.h>
#include <stdio.h>

char lcd_buffer[33];

/* максимальное количество DS1820/DS18S20, 
   подключенных к шине 1-Wire */
#define MAX_DEVICES 8

/* область хранения ROM кода устройств DS1820/DS18S20 */
unsigned char rom_code[MAX_DEVICES,9];

main()
{
unsigned char i,j,devices;
int temp;

lcd_init(16);
lcd_putsf("CodeVisionAVR\n1 Wire Bus Demo");
delay_ms(2000);
lcd_clear();

/* определим сколько устройств DS1820/DS18S20
   подключено к шине 1-Wire */
devices=w1_search(0xf0,rom_code);
sprintf(lcd_buffer,"%u DS1820\nDevice detected",devices);
lcd_puts(lcd_buffer);
delay_ms(2000);

/* отобразим ROM код каждого устройства */
if (devices)
  {
    for (i=0;i<devices;i++)
    {
      sprintf(lcd_buffer,"Device #%u ROM\nCode is:",i+1);
      lcd_clear();
      lcd_puts(lcd_buffer);
      delay_ms(2000);
      lcd_clear();
      for (j=0;j<8;j++)
      {
        sprintf(lcd_buffer,"%02X ",rom_code[i,j]);
        lcd_puts(lcd_buffer);
        if (j==3) lcd_gotoxy(0,1);
      };
      delay_ms(5000);
    };
  }
else
  while (1); 
  /* здесь остановка, если не было обнаружено никакого устройства */

/* измерим и отобразим температуры */
while (1)
{
  for (i=0;i<devices;)
  {
    temp=ds1820_temperature_10(&rom_code[i,0]);
    sprintf(lcd_buffer,"t%u=%i.%u\xdfC",++i,temp/10,abs(temp%10));
    lcd_clear();
    lcd_puts(lcd_buffer);
    delay_ms(800);
  };
};
}
